package com.zjw.study.thread01_create;

/**
 * 线程学习 -- 创建线程
 * 1.Thread的匿名内部类
 * 2.Runnable的匿名内部类
 * 3.继承Thread或实现Runnable接口
 * 4.java8新特性
 * ……
 * 还有其他的创建方式，但多数是在以上几种类型的基础上进行的开发
 * 
 * study
 * 1.同时使用方法1和2，会全部执行吗？
 * 
 * question
 * 1.为什么lambda总是在study后面执行？调到最后一个调用反Thread时而在前面，但第二、三种方法始终在study后面
 * @author Administrator
 *
 */
public class CreateThread01 {

	public static void main(String[] args) {
		create04();
		create03();
		create01();
		create02();
		study01();
	}

	/**
	 * 方法一，Thread匿名内部类：new Thread() {...}
	 */
	static void create01() {
		new Thread() {
			/**
			 * 重写run方法
			 */
			public void run() {
				System.out.println("new Thread，线程名：" + this.getName());
			};
		}.start();
	}
	
	/**
	 * 方法二，Runnable匿名内部类
	 * 【常用】,使用创建的Running对象作为参数，符合面向对象开发思想
	 */
	static void create02() {
		new Thread(new Runnable() {
			
			public void run() {
				System.out.println("Runnable线程，名称：" + Thread.currentThread().getName());
			}
		}).start();;
	}
	
	/**
	 * 新建类继承Thread并重写run方法
	 * 也可用实现Runnable接口的方式
	 */
	static void create03() {
		class Create04 extends Thread {
			@Override
			public void run() {
				System.out.println("extends Thread，名称" + super.getName());
			}
		}
		
		//实例化继承Thread的类并启动线程
		new Create04().start();
	}
	
	/**
	 * 使用java8的新特性：lambda表达式
	 */
	static void create04() {
		new Thread(() -> {
			System.out.println("lambda表达式创建，名称" + Thread.currentThread().getName());
		}).start();;
	}
	
	/**
	 * 学习，同时使用Runnable和Thread匿名方法，谁的能执行？
	 */
	static void study01() {
		System.out.println("------------------ 学习测试");
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("study：Runnable=" + Thread.currentThread().getName());
			}
		}) {
			@Override
			public void run() {
				System.out.println("study：Thread=" + this.getName());
			}
		}.start();
	}
}
